use std::sync::Arc;
use tokio::sync::Mutex;
use tracing::info;
use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
use std::{path::Path, fs::OpenOptions};

use apilogger::{config::Config, models::RequestLog};



fn setup_logging(config: &Config) -> Result<(), Box<dyn std::error::Error>> {
    // 创建日志目录
    std::fs::create_dir_all(&config.logging.directory)?;

    let log_file = Path::new(&config.logging.directory).join(&config.logging.filename);

    // 配置日志级别
    let env_filter = EnvFilter::try_from_default_env()
        .unwrap_or_else(|_| EnvFilter::new(config.logging.level.to_lowercase()));

    // 配置文件日志层
    let file = OpenOptions::new()
        .create(true)
        .append(true)
        .open(log_file)?;

    let file_layer = fmt::layer()
        .with_writer(file)
        .with_target(false)
        .with_thread_ids(false)
        .with_thread_names(false)
        .with_file(true)
        .with_line_number(true)
        .with_level(true);
    
    // 配置控制台日志层
    let console_layer = fmt::layer()
        .with_target(false)
        .with_ansi(true); // 在控制台上启用颜色
        
    // 注册所有日志层
    tracing_subscriber::registry()
        .with(env_filter)
        .with(file_layer)
        .with(console_layer)
        .init();

    Ok(())
}

#[tokio::main]
async fn main() {
    // 加载配置
    let config = Config::new().expect("Failed to load configuration");

    // 设置日志
    setup_logging(&config).expect("Failed to setup logging");

    // 创建应用状态
    let state = Arc::new(Mutex::new(Vec::<RequestLog>::new()));

    // 构建应用
    let app = apilogger::create_app(config.clone(), state);

    info!("Starting server on {}", config.server.address);
    info!("Log level: {}", config.logging.level);
    info!("Log file: {}/{}", config.logging.directory, config.logging.filename);

    // 启动服务器
    let listener = tokio::net::TcpListener::bind(config.server.address)
        .await
        .unwrap();
    axum::serve(listener, app).await.unwrap();
}
